<?php

declare(strict_types=1);

namespace app\model\esxsys;

use think\Model;
use app\eslib\EsUtils;

/**
 * 系统配置模型类
 * @version 1.0.0
 */
class ConfigsModel extends Model
{
    // 设置当前模型对应的完整数据表名称
    protected $table = 'esxsys_configs';

    // 数据表名称常量
    const TABLE_NAME = 'esxsys_configs';

    // 开启自动时间戳（默认为整型int）
    protected $autoWriteTimestamp = true;

    // 定义时间戳字段名
    protected $createTime = 'created_at';
    protected $updateTime = 'updated_at';

    /**
     * 返回 组件名称 访问器的数据
     * @return array
     */
    public function getComponentNameDataAttr(): array
    {
        return [
            ['text' => '文本框', 'value' => 'textbox'],
            ['text' => '数字输入框', 'value' => 'numbox'],
            ['text' => '日期输入框', 'value' => 'datebox'],
            ['text' => '日期时间输入框', 'value' => 'datetimebox'],
            ['text' => '多行文本输入框', 'value' => 'textarea'],
            ['text' => '下拉框', 'value' => 'select'],
            ['text' => '单选框', 'value' => 'radio'],
            ['text' => '复选框', 'value' => 'checkbox'],
            ['text' => '图片上传组件', 'value' => 'imguploader'],
            ['text' => '文件上传组件', 'value' => 'fileuploader'],
            ['text' => '可视化编辑器', 'value' => 'editor'],
        ];
    }

    /**
     * 返回 组件名称 访问器的值
     * @return string
     */
    public function getComponentNameTextAttr($value, $data)
    {
        $value = $data['component_name'];
        if (is_numeric($value)) {
            $value = intval($value);
        }
        $data = (array) $this->getComponentNameDataAttr();
        $result = array_filter($data, function ($v) use ($value) {
            return $v['value'] == $value;
        }, ARRAY_FILTER_USE_BOTH);
        return $result ? current($result)['text'] : $value;
    }
    /**
     * 返回 状态 访问器的数据
     * @return array
     */
    public function getStatusDataAttr(): array
    {
        return [
            ['text' => '禁用', 'value' => 0],
            ['text' => '启用', 'value' => 1],
        ];
    }

    /**
     * 返回 状态 访问器的值
     * @return string
     */
    public function getStatusTextAttr($value, $data)
    {
        $value = $data['status'];
        if (is_numeric($value)) {
            $value = intval($value);
        }
        $data = (array) $this->getStatusDataAttr();
        $result = array_filter($data, function ($v) use ($value) {
            return $v['value'] == $value;
        }, ARRAY_FILTER_USE_BOTH);
        return $result ? current($result)['text'] : $value;
    }
    /**
     * 返回 是否锁定 访问器的数据
     * @return array
     */
    public function getIsLockedDataAttr(): array
    {
        return [
            ['text' => '否', 'value' => 0],
            ['text' => '是', 'value' => 1],
        ];
    }

    /**
     * 返回 是否锁定 访问器的值
     * @return string
     */
    public function getIsLockedTextAttr($value, $data)
    {
        $value = $data['is_locked'];
        if (is_numeric($value)) {
            $value = intval($value);
        }
        $data = (array) $this->getIsLockedDataAttr();
        $result = array_filter($data, function ($v) use ($value) {
            return $v['value'] == $value;
        }, ARRAY_FILTER_USE_BOTH);
        return $result ? current($result)['text'] : $value;
    }

    /**
     * 使用视图查询
     */
    public function scopeDbView($query)
    {
        return $query->table('v_esxsys_config');
    }

    /**
     * 复制指定的记录
     */
    public static function copy($id)
    {
        $data = self::find($id)->toArray();
        $data['xxx_name'] .= ' - 副本';
        unset($data['id']);
        unset($data['created_at']);
        unset($data['updated_at']);
        try {
            $model = self::create($data);
            return EsUtils::stdMessage(true, '', $model->id);
        } catch (\PDOException $ex) {
            return EsUtils::stdMessage(false, $ex->getMessage());
        }
    }

    /**
     * 从配置文件创建数据记录
     */
    public static function createRecordsByConfig($config)
    {
        if (!is_array($config)) {
            return;
        }
        $titles = [
            'app_name' => '站点名称',
            'app_version' => '版本号',
            'icp_license' => 'ICP 备案号',
            'ip_allowlist' => 'IP 黑名单',
            'ip_denylist' => 'IP 白名单',
            'email_transport' => '邮件发送方式',
            'smtp_host' => 'SMTP 服务器',
            'smtp_port' => 'SMTP 端口',
            'smtp_username' => 'SMTP 用户名',
            'smtp_password' => 'SMTP 密码',
            'smtp_address' => '发件人邮箱',
        ];
        $data = [];
        foreach ($config as $key => $value) {
            $data = [
                'group_name' => 'site',
                'conf_name' => $key,
                'conf_title' => isset($titles[$key]) ? $titles[$key] : $key,
                'conf_type' => gettype($value), // 类型(string,text,int,bool,array,datetime,date,file)
                'conf_value' => is_array($value) ? json_encode($value) : $value,
                'conf_content' => '',
            ];
            self::create($data);
        }
    }
}
